#ifndef SESION_H
#define	SESION_H

#include <vector>
#include "Thread.h"
#include "IManejadorSesionEvento.h"
#include "IMensajeEntranteManejador.h"
#include "IMensajero.h"
#include "IEnviante.h"

using namespace std;
using namespace TP::Threading;
using namespace TP::Comunicacion::Eventos;

namespace TP { namespace Comunicacion {
    
class Sesion : public Thread::Thread , public IMensajero, public IEnviante {

public:    
    Sesion(int pFileDescriptor, struct sockaddr_in* pClientAddress);

    virtual ~Sesion();

    void agregarMensajeEntranteManejador (IMensajeEntranteManejador* pManejador);
        
    void agregarManejadorSesionEvento (IManejadorSesionEvento* pManejador);
        
    virtual void Iniciar() throw (Excepcion&);

    virtual void Finalizar() throw (Excepcion&);

    virtual void Responder (const string& pMensaje) throw (Excepcion&);
        
protected:
    virtual void tarea ();     
    void manejarErrorComunicacion (int pEstadoComunicacion);

private:
    int fileDescriptor;
    struct sockaddr_in* clientAddress;
    IManejadorSesionEvento* manejadorSesionEvento;
    vector<IMensajeEntranteManejador* > mensajeSesionManejadores;
    bool conexionFinalizada, errorConexion;
};
}}

#endif	/* SESION_H */

